library(tibble)
library(tidyr)
library(tidyquant) # To download the data
## Zorunlu paket yükleniyor: lubridate
## Zorunlu paket yükleniyor: timechange
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
## Zorunlu paket yükleniyor: PerformanceAnalytics
## Zorunlu paket yükleniyor: xts
## Zorunlu paket yükleniyor: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
## Zorunlu paket yükleniyor: quantmod
## Zorunlu paket yükleniyor: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(plotly) # To create interactive charts
## Zorunlu paket yükleniyor: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(timetk)
library(forcats)
symbols <- c("AKBNK.IS","AKSEN.IS","ARCLK.IS","ASELS.IS","BIMAS.IS","EKGYO.IS","EREGL.IS","FROTO.IS",
"GARAN.IS",
"GUBRF.IS" ,"HEKTS.IS","ISCTR.IS","KCHOL.IS","KOZAA.IS","KOZAL.IS","KRDMD.IS","PETKM.IS","PGSUS.IS",
"SAHOL.IS","SASA.IS","SISE.IS","TAVHL.IS","TCELL.IS","THYAO.IS","TKFEN.IS","TOASO.IS","TTKOM.IS","TUPRS.IS",
"VESTL.IS","YKBNK.IS")
prices <- quantmod::getSymbols(
Symbols =symbols,
src = "yahoo",
from = "2020-01-01",
auto.assign = TRUE,
warnings = FALSE
) %>%
# The map function takes an anonymous function and will return a list of five
# The function Ad() extracts the daily adjusted price series
purrr::map(.f = ~ quantmod::Ad(get(x = .x))) %>%
# Use reduce() to merge the elements of .x interactively
purrr::reduce(.f = merge) %>%
# Use a replacement function to set column names to ticker symbols
# This function is in prefix form
# It is equivalent to colnames(x = prices) <- value
`colnames<-`(value = symbols)
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
# Keep only the last reading of each month
# We could have chosen to keep only the first reading of each month
asset_returns_xts <- xts::to.daily(
x = prices,
drop.time = TRUE,
indexAt = "lastof",
OHLC = FALSE
) %>%
# Compute simple returns
# Log returns are time-additive but not portfolio additive
PerformanceAnalytics::Return.calculate(method = "discrete") %>%
# Drop the first row since we lose 12/31/2012
stats::na.omit()
# Keep only the xts returns, ticker symbols, and the prices series
rm(list = setdiff(x = ls(), y = c("symbols", "prices", "asset_returns_xts")))
# Visualize cumulative returns
chart.CumReturns(asset_returns_xts, main = "Cumulative returns of ETFs", legend.loc = "topleft")

mean_ret <- colMeans(asset_returns_xts)
print(round(mean_ret, 5))
## AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO.IS
## 0.00142 0.00493 0.00250 0.00240 0.00173 0.00267 0.00306 0.00321
## GARAN.IS GUBRF.IS HEKTS.IS ISCTR.IS KCHOL.IS KOZAA.IS KOZAL.IS KRDMD.IS
## 0.00156 0.00489 0.00684 0.00220 0.00207 0.00259 0.00278 0.00286
## PETKM.IS PGSUS.IS SAHOL.IS SASA.IS SISE.IS TAVHL.IS TCELL.IS THYAO.IS
## 0.00269 0.00279 0.00237 0.00579 0.00313 0.00200 0.00164 0.00335
## TKFEN.IS TOASO.IS TTKOM.IS TUPRS.IS VESTL.IS YKBNK.IS
## 0.00156 0.00306 0.00188 0.00214 0.00294 0.00253
cov_mat <- cov(asset_returns_xts) * 252
print(round(cov_mat,4))
## AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS
## AKBNK.IS 0.1776 0.0611 0.0636 0.0777 0.0479 0.1093 0.0702
## AKSEN.IS 0.0611 0.2314 0.0602 0.0748 0.0405 0.0878 0.0565
## ARCLK.IS 0.0636 0.0602 0.1392 0.0732 0.0381 0.0744 0.0686
## ASELS.IS 0.0777 0.0748 0.0732 0.1800 0.0454 0.0940 0.0819
## BIMAS.IS 0.0479 0.0405 0.0381 0.0454 0.1109 0.0542 0.0537
## EKGYO.IS 0.1093 0.0878 0.0744 0.0940 0.0542 0.2171 0.0727
## EREGL.IS 0.0702 0.0565 0.0686 0.0819 0.0537 0.0727 0.1734
## FROTO.IS 0.0625 0.0652 0.0860 0.0868 0.0463 0.0711 0.0774
## GARAN.IS 0.1545 0.0547 0.0547 0.0709 0.0372 0.0866 0.0594
## GUBRF.IS 0.0722 0.0662 0.0594 0.0968 0.0515 0.0889 0.0619
## HEKTS.IS 0.0660 0.0911 0.0519 0.0735 0.0385 0.0763 0.0491
## ISCTR.IS 0.1589 0.0562 0.0656 0.0774 0.0485 0.1104 0.0757
## KCHOL.IS 0.1037 0.0628 0.0846 0.0908 0.0567 0.0928 0.0870
## KOZAA.IS 0.0727 0.0796 0.0646 0.1022 0.0406 0.0970 0.0716
## KOZAL.IS 0.0547 0.0724 0.0573 0.0971 0.0384 0.0875 0.0691
## KRDMD.IS 0.0964 0.0847 0.0822 0.1037 0.0501 0.1025 0.1325
## PETKM.IS 0.0721 0.0883 0.0705 0.0828 0.0482 0.0896 0.0849
## PGSUS.IS 0.0957 0.0776 0.0821 0.0959 0.0363 0.0971 0.0687
## SAHOL.IS 0.1109 0.0592 0.0719 0.0827 0.0540 0.0931 0.0793
## SASA.IS 0.0797 0.0880 0.0797 0.0941 0.0440 0.0871 0.0823
## SISE.IS 0.0802 0.0672 0.0733 0.0916 0.0476 0.0915 0.0827
## TAVHL.IS 0.0812 0.0665 0.0753 0.0869 0.0443 0.0874 0.0703
## TCELL.IS 0.0693 0.0398 0.0584 0.0741 0.0463 0.0646 0.0624
## THYAO.IS 0.0893 0.0758 0.0816 0.0940 0.0455 0.0956 0.0836
## TKFEN.IS 0.0725 0.0672 0.0647 0.0827 0.0450 0.0930 0.0684
## TOASO.IS 0.0671 0.0668 0.0815 0.0874 0.0468 0.0802 0.0799
## TTKOM.IS 0.0947 0.0679 0.0727 0.0992 0.0460 0.0971 0.0776
## TUPRS.IS 0.0738 0.0738 0.0670 0.0858 0.0454 0.0769 0.0781
## VESTL.IS 0.0611 0.0795 0.0779 0.0903 0.0433 0.0836 0.0672
## YKBNK.IS 0.1634 0.0695 0.0706 0.0793 0.0526 0.1125 0.0766
## FROTO.IS GARAN.IS GUBRF.IS HEKTS.IS ISCTR.IS KCHOL.IS KOZAA.IS
## AKBNK.IS 0.0625 0.1545 0.0722 0.0660 0.1589 0.1037 0.0727
## AKSEN.IS 0.0652 0.0547 0.0662 0.0911 0.0562 0.0628 0.0796
## ARCLK.IS 0.0860 0.0547 0.0594 0.0519 0.0656 0.0846 0.0646
## ASELS.IS 0.0868 0.0709 0.0968 0.0735 0.0774 0.0908 0.1022
## BIMAS.IS 0.0463 0.0372 0.0515 0.0385 0.0485 0.0567 0.0406
## EKGYO.IS 0.0711 0.0866 0.0889 0.0763 0.1104 0.0928 0.0970
## EREGL.IS 0.0774 0.0594 0.0619 0.0491 0.0757 0.0870 0.0716
## FROTO.IS 0.2328 0.0492 0.0678 0.0662 0.0635 0.0954 0.0719
## GARAN.IS 0.0492 0.1853 0.0574 0.0543 0.1443 0.0934 0.0620
## GUBRF.IS 0.0678 0.0574 0.3164 0.1001 0.0681 0.0793 0.1042
## HEKTS.IS 0.0662 0.0543 0.1001 0.3962 0.0649 0.0611 0.0908
## ISCTR.IS 0.0635 0.1443 0.0681 0.0649 0.1883 0.1057 0.0726
## KCHOL.IS 0.0954 0.0934 0.0793 0.0611 0.1057 0.1528 0.0863
## KOZAA.IS 0.0719 0.0620 0.1042 0.0908 0.0726 0.0863 0.2374
## KOZAL.IS 0.0706 0.0452 0.0851 0.0871 0.0594 0.0771 0.1883
## KRDMD.IS 0.0924 0.0873 0.0813 0.0687 0.1006 0.1015 0.0975
## PETKM.IS 0.0801 0.0569 0.0804 0.0639 0.0763 0.0867 0.0854
## PGSUS.IS 0.0795 0.0889 0.0852 0.0822 0.0958 0.1128 0.0876
## SAHOL.IS 0.0763 0.1006 0.0724 0.0561 0.1113 0.1127 0.0764
## SASA.IS 0.0939 0.0677 0.1031 0.1373 0.0764 0.1002 0.1049
## SISE.IS 0.0788 0.0678 0.0745 0.0630 0.0830 0.0904 0.0883
## TAVHL.IS 0.0819 0.0710 0.0746 0.0745 0.0800 0.1008 0.0783
## TCELL.IS 0.0627 0.0547 0.0656 0.0508 0.0682 0.0729 0.0702
## THYAO.IS 0.0842 0.0790 0.0883 0.0731 0.0905 0.1077 0.0810
## TKFEN.IS 0.0708 0.0593 0.0736 0.0657 0.0706 0.0838 0.0797
## TOASO.IS 0.1244 0.0568 0.0781 0.0796 0.0708 0.0934 0.0844
## TTKOM.IS 0.0739 0.0829 0.0887 0.0748 0.0894 0.0938 0.1009
## TUPRS.IS 0.0804 0.0670 0.0736 0.0541 0.0748 0.0926 0.0875
## VESTL.IS 0.0714 0.0483 0.0848 0.0702 0.0634 0.0746 0.0893
## YKBNK.IS 0.0668 0.1504 0.0764 0.0693 0.1658 0.1076 0.0751
## KOZAL.IS KRDMD.IS PETKM.IS PGSUS.IS SAHOL.IS SASA.IS SISE.IS TAVHL.IS
## AKBNK.IS 0.0547 0.0964 0.0721 0.0957 0.1109 0.0797 0.0802 0.0812
## AKSEN.IS 0.0724 0.0847 0.0883 0.0776 0.0592 0.0880 0.0672 0.0665
## ARCLK.IS 0.0573 0.0822 0.0705 0.0821 0.0719 0.0797 0.0733 0.0753
## ASELS.IS 0.0971 0.1037 0.0828 0.0959 0.0827 0.0941 0.0916 0.0869
## BIMAS.IS 0.0384 0.0501 0.0482 0.0363 0.0540 0.0440 0.0476 0.0443
## EKGYO.IS 0.0875 0.1025 0.0896 0.0971 0.0931 0.0871 0.0915 0.0874
## EREGL.IS 0.0691 0.1325 0.0849 0.0687 0.0793 0.0823 0.0827 0.0703
## FROTO.IS 0.0706 0.0924 0.0801 0.0795 0.0763 0.0939 0.0788 0.0819
## GARAN.IS 0.0452 0.0873 0.0569 0.0889 0.1006 0.0677 0.0678 0.0710
## GUBRF.IS 0.0851 0.0813 0.0804 0.0852 0.0724 0.1031 0.0745 0.0746
## HEKTS.IS 0.0871 0.0687 0.0639 0.0822 0.0561 0.1373 0.0630 0.0745
## ISCTR.IS 0.0594 0.1006 0.0763 0.0958 0.1113 0.0764 0.0830 0.0800
## KCHOL.IS 0.0771 0.1015 0.0867 0.1128 0.1127 0.1002 0.0904 0.1008
## KOZAA.IS 0.1883 0.0975 0.0854 0.0876 0.0764 0.1049 0.0883 0.0783
## KOZAL.IS 0.2098 0.0872 0.0777 0.0764 0.0660 0.0897 0.0784 0.0698
## KRDMD.IS 0.0872 0.2354 0.1140 0.0997 0.0921 0.0900 0.1016 0.0895
## PETKM.IS 0.0777 0.1140 0.1955 0.0927 0.0807 0.0827 0.0907 0.0789
## PGSUS.IS 0.0764 0.0997 0.0927 0.3226 0.0955 0.1110 0.0971 0.1912
## SAHOL.IS 0.0660 0.0921 0.0807 0.0955 0.1413 0.0766 0.0844 0.0852
## SASA.IS 0.0897 0.0900 0.0827 0.1110 0.0766 0.3607 0.0886 0.0915
## SISE.IS 0.0784 0.1016 0.0907 0.0971 0.0844 0.0886 0.1599 0.0941
## TAVHL.IS 0.0698 0.0895 0.0789 0.1912 0.0852 0.0915 0.0941 0.2121
## TCELL.IS 0.0627 0.0661 0.0624 0.0578 0.0691 0.0576 0.0659 0.0582
## THYAO.IS 0.0699 0.0993 0.0986 0.1929 0.0956 0.0989 0.0984 0.1579
## TKFEN.IS 0.0692 0.0847 0.0884 0.0919 0.0801 0.0884 0.0864 0.0909
## TOASO.IS 0.0729 0.0895 0.0737 0.0839 0.0767 0.1064 0.0796 0.0787
## TTKOM.IS 0.0838 0.0981 0.0830 0.0927 0.0928 0.0838 0.0862 0.0828
## TUPRS.IS 0.0764 0.0978 0.1069 0.1034 0.0839 0.0799 0.0872 0.0923
## VESTL.IS 0.0810 0.0903 0.0719 0.0956 0.0694 0.0982 0.0843 0.0770
## YKBNK.IS 0.0576 0.1046 0.0882 0.0910 0.1150 0.0803 0.0828 0.0839
## TCELL.IS THYAO.IS TKFEN.IS TOASO.IS TTKOM.IS TUPRS.IS VESTL.IS
## AKBNK.IS 0.0693 0.0893 0.0725 0.0671 0.0947 0.0738 0.0611
## AKSEN.IS 0.0398 0.0758 0.0672 0.0668 0.0679 0.0738 0.0795
## ARCLK.IS 0.0584 0.0816 0.0647 0.0815 0.0727 0.0670 0.0779
## ASELS.IS 0.0741 0.0940 0.0827 0.0874 0.0992 0.0858 0.0903
## BIMAS.IS 0.0463 0.0455 0.0450 0.0468 0.0460 0.0454 0.0433
## EKGYO.IS 0.0646 0.0956 0.0930 0.0802 0.0971 0.0769 0.0836
## EREGL.IS 0.0624 0.0836 0.0684 0.0799 0.0776 0.0781 0.0672
## FROTO.IS 0.0627 0.0842 0.0708 0.1244 0.0739 0.0804 0.0714
## GARAN.IS 0.0547 0.0790 0.0593 0.0568 0.0829 0.0670 0.0483
## GUBRF.IS 0.0656 0.0883 0.0736 0.0781 0.0887 0.0736 0.0848
## HEKTS.IS 0.0508 0.0731 0.0657 0.0796 0.0748 0.0541 0.0702
## ISCTR.IS 0.0682 0.0905 0.0706 0.0708 0.0894 0.0748 0.0634
## KCHOL.IS 0.0729 0.1077 0.0838 0.0934 0.0938 0.0926 0.0746
## KOZAA.IS 0.0702 0.0810 0.0797 0.0844 0.1009 0.0875 0.0893
## KOZAL.IS 0.0627 0.0699 0.0692 0.0729 0.0838 0.0764 0.0810
## KRDMD.IS 0.0661 0.0993 0.0847 0.0895 0.0981 0.0978 0.0903
## PETKM.IS 0.0624 0.0986 0.0884 0.0737 0.0830 0.1069 0.0719
## PGSUS.IS 0.0578 0.1929 0.0919 0.0839 0.0927 0.1034 0.0956
## SAHOL.IS 0.0691 0.0956 0.0801 0.0767 0.0928 0.0839 0.0694
## SASA.IS 0.0576 0.0989 0.0884 0.1064 0.0838 0.0799 0.0982
## SISE.IS 0.0659 0.0984 0.0864 0.0796 0.0862 0.0872 0.0843
## TAVHL.IS 0.0582 0.1579 0.0909 0.0787 0.0828 0.0923 0.0770
## TCELL.IS 0.1340 0.0658 0.0668 0.0575 0.0943 0.0608 0.0583
## THYAO.IS 0.0658 0.2002 0.0971 0.0876 0.0910 0.1029 0.0893
## TKFEN.IS 0.0668 0.0971 0.1645 0.0779 0.0845 0.0713 0.0782
## TOASO.IS 0.0575 0.0876 0.0779 0.1880 0.0786 0.0763 0.0811
## TTKOM.IS 0.0943 0.0910 0.0845 0.0786 0.1716 0.0796 0.0821
## TUPRS.IS 0.0608 0.1029 0.0713 0.0763 0.0796 0.1667 0.0674
## VESTL.IS 0.0583 0.0893 0.0782 0.0811 0.0821 0.0674 0.1942
## YKBNK.IS 0.0642 0.0899 0.0795 0.0774 0.0944 0.0775 0.0604
## YKBNK.IS
## AKBNK.IS 0.1634
## AKSEN.IS 0.0695
## ARCLK.IS 0.0706
## ASELS.IS 0.0793
## BIMAS.IS 0.0526
## EKGYO.IS 0.1125
## EREGL.IS 0.0766
## FROTO.IS 0.0668
## GARAN.IS 0.1504
## GUBRF.IS 0.0764
## HEKTS.IS 0.0693
## ISCTR.IS 0.1658
## KCHOL.IS 0.1076
## KOZAA.IS 0.0751
## KOZAL.IS 0.0576
## KRDMD.IS 0.1046
## PETKM.IS 0.0882
## PGSUS.IS 0.0910
## SAHOL.IS 0.1150
## SASA.IS 0.0803
## SISE.IS 0.0828
## TAVHL.IS 0.0839
## TCELL.IS 0.0642
## THYAO.IS 0.0899
## TKFEN.IS 0.0795
## TOASO.IS 0.0774
## TTKOM.IS 0.0944
## TUPRS.IS 0.0775
## VESTL.IS 0.0604
## YKBNK.IS 0.2040
# Visualize cumulative returns
chart.CumReturns(asset_returns_xts, main = "Cumulative returns of ETFs", legend.loc = "topleft")

wts <- runif(n = length(symbols))
print(wts)
## [1] 0.62929554 0.12115758 0.41081475 0.59875396 0.70667320 0.49918052
## [7] 0.08624367 0.08712992 0.29052049 0.49581808 0.10099747 0.79278362
## [13] 0.17590865 0.95954451 0.23290811 0.88742730 0.80858684 0.80740807
## [19] 0.45912224 0.08194936 0.97471197 0.60145936 0.72198195 0.12346464
## [25] 0.22679494 0.71014970 0.11049605 0.45550525 0.89170069 0.73254283
print(sum(wts))
## [1] 14.78103
wts <- wts/sum(wts)
print(wts)
## [1] 0.042574536 0.008196829 0.027793375 0.040508267 0.047809465 0.033771698
## [7] 0.005834753 0.005894712 0.019654954 0.033544215 0.006832911 0.053635204
## [13] 0.011900973 0.064917291 0.015757230 0.060038253 0.054704359 0.054624610
## [19] 0.031061584 0.005544225 0.065943434 0.040691299 0.048845167 0.008352911
## [25] 0.015343648 0.048044665 0.007475531 0.030816879 0.060327366 0.049559657
sum(wts)
## [1] 1
port_returns <- (sum(wts * mean_ret) + 1)^252 - 1
port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))
print(port_risk)
## [,1]
## [1,] 0.2940868
# Since Risk free rate is 0%
sharpe_ratio <- port_returns/port_risk
print(sharpe_ratio)
## [,1]
## [1,] 3.140113
# Calculate the random weights
wts <- runif(n = length(symbols))
wts <- wts/sum(wts)
# Calculate the portfolio returns
port_returns <- (sum(wts * mean_ret) + 1)^252 - 1
# Calculate the portfolio risk
port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))
# Calculate the Sharpe Ratio
sharpe_ratio <- port_returns/port_risk
print(wts)
## [1] 0.0188110231 0.0145017473 0.0410073223 0.0434455563 0.0225632466
## [6] 0.0539190170 0.0799638514 0.0228088505 0.0284690200 0.0132920548
## [11] 0.0036945388 0.0655912384 0.0167154193 0.0223911918 0.0516605642
## [16] 0.0004851297 0.0482595685 0.0658391929 0.0241475004 0.0246213456
## [21] 0.0415675904 0.0750848111 0.0105217971 0.0188211239 0.0718948453
## [26] 0.0162671793 0.0063193418 0.0281671072 0.0466090885 0.0225597365
print(port_returns)
## [1] 0.9354943
print(port_risk)
## [,1]
## [1,] 0.2953227
print(sharpe_ratio)
## [,1]
## [1,] 3.167702
num_port <- 50000
# Creating a matrix to store the weights
all_wts <- matrix(nrow = num_port,
ncol = length(symbols))
# Creating an empty vector to store
# Portfolio returns
port_returns <- vector('numeric', length = num_port)
# Creating an empty vector to store
# Portfolio Standard deviation
port_risk <- vector('numeric', length = num_port)
# Creating an empty vector to store
# Portfolio Sharpe Ratio
sharpe_ratio <- vector('numeric', length = num_port)
for (i in seq_along(port_returns)) {
wts <- runif(length(symbols))
wts <- wts/sum(wts)
# Storing weight in the matrix
all_wts[i,] <- wts
# Portfolio returns
port_ret <- sum(wts * mean_ret)
port_ret <- ((port_ret + 1)^252) - 1
# Storing Portfolio Returns values
port_returns[i] <- port_ret
# Creating and storing portfolio risk
port_sd <- sqrt(t(wts) %*% (cov_mat %*% wts))
port_risk[i] <- port_sd
# Creating and storing Portfolio Sharpe Ratios
# Assuming 0% Risk free rate
sr <- port_ret/port_sd
sharpe_ratio[i] <- sr
}
# Storing the values in the table
portfolio_values <- tibble(Return = port_returns,
Risk = port_risk,
SharpeRatio = sharpe_ratio)
# Converting matrix to a tibble and changing column names
all_wts <- tk_tbl(all_wts)
## Warning in tk_tbl.data.frame(as.data.frame(data), preserve_index,
## rename_index, : Warning: No index to preserve. Object otherwise converted to
## tibble successfully.
colnames(all_wts) <- colnames(asset_returns_xts)
# Combing all the values together
portfolio_values <- tk_tbl(cbind(all_wts, portfolio_values))
## Warning in tk_tbl.data.frame(cbind(all_wts, portfolio_values)): Warning: No
## index to preserve. Object otherwise converted to tibble successfully.
head(portfolio_values)
## # A tibble: 6 × 33
## AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO…¹ GARAN…²
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.0541 0.0216 0.0240 0.0470 0.0196 0.0437 0.0516 0.0210 0.0227
## 2 0.0326 0.0165 0.0294 0.0198 0.0429 0.0276 0.0370 0.0554 0.0382
## 3 0.0426 0.0424 0.00417 0.0365 0.00759 0.0228 0.00464 0.0470 0.0787
## 4 0.0308 0.0203 0.0233 0.0547 0.00283 0.0477 0.0100 0.0443 0.0220
## 5 0.0138 0.0482 0.0391 0.0284 0.0187 0.0752 0.00162 0.0667 0.00655
## 6 0.0403 0.00176 0.00201 0.0398 0.0418 0.0306 0.0271 0.0538 0.0687
## # … with 24 more variables: GUBRF.IS <dbl>, HEKTS.IS <dbl>, ISCTR.IS <dbl>,
## # KCHOL.IS <dbl>, KOZAA.IS <dbl>, KOZAL.IS <dbl>, KRDMD.IS <dbl>,
## # PETKM.IS <dbl>, PGSUS.IS <dbl>, SAHOL.IS <dbl>, SASA.IS <dbl>,
## # SISE.IS <dbl>, TAVHL.IS <dbl>, TCELL.IS <dbl>, THYAO.IS <dbl>,
## # TKFEN.IS <dbl>, TOASO.IS <dbl>, TTKOM.IS <dbl>, TUPRS.IS <dbl>,
## # VESTL.IS <dbl>, YKBNK.IS <dbl>, Return <dbl>, Risk <dbl>,
## # SharpeRatio <dbl>, and abbreviated variable names ¹​FROTO.IS, ²​GARAN.IS
min_var <- portfolio_values[which.min(portfolio_values$Risk),]
max_sr <- portfolio_values[which.max(portfolio_values$SharpeRatio),]
min_var
## # A tibble: 1 × 33
## AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO…¹ GARAN…²
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.00979 0.0630 0.0657 0.0268 0.0687 0.00290 0.0535 0.0156 0.0683
## # … with 24 more variables: GUBRF.IS <dbl>, HEKTS.IS <dbl>, ISCTR.IS <dbl>,
## # KCHOL.IS <dbl>, KOZAA.IS <dbl>, KOZAL.IS <dbl>, KRDMD.IS <dbl>,
## # PETKM.IS <dbl>, PGSUS.IS <dbl>, SAHOL.IS <dbl>, SASA.IS <dbl>,
## # SISE.IS <dbl>, TAVHL.IS <dbl>, TCELL.IS <dbl>, THYAO.IS <dbl>,
## # TKFEN.IS <dbl>, TOASO.IS <dbl>, TTKOM.IS <dbl>, TUPRS.IS <dbl>,
## # VESTL.IS <dbl>, YKBNK.IS <dbl>, Return <dbl>, Risk <dbl>,
## # SharpeRatio <dbl>, and abbreviated variable names ¹​FROTO.IS, ²​GARAN.IS
p <- min_var %>%
gather(AKBNK.IS:YKBNK.IS, key = Asset,
value = Weights) %>%
mutate(Asset = as.factor(Asset)) %>%
ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
geom_bar(stat = 'identity') +
theme_minimal() +
labs(x = 'Assets', y = 'Weights', title = "Minimum Variance Portfolio Weights") +
scale_y_continuous(labels = scales::percent)
ggplotly(p)
max_sr
## # A tibble: 1 × 33
## AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO…¹ GARAN…²
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.0273 0.0656 0.0410 0.0527 0.0612 0.0161 0.0517 0.00345 0.00573
## # … with 24 more variables: GUBRF.IS <dbl>, HEKTS.IS <dbl>, ISCTR.IS <dbl>,
## # KCHOL.IS <dbl>, KOZAA.IS <dbl>, KOZAL.IS <dbl>, KRDMD.IS <dbl>,
## # PETKM.IS <dbl>, PGSUS.IS <dbl>, SAHOL.IS <dbl>, SASA.IS <dbl>,
## # SISE.IS <dbl>, TAVHL.IS <dbl>, TCELL.IS <dbl>, THYAO.IS <dbl>,
## # TKFEN.IS <dbl>, TOASO.IS <dbl>, TTKOM.IS <dbl>, TUPRS.IS <dbl>,
## # VESTL.IS <dbl>, YKBNK.IS <dbl>, Return <dbl>, Risk <dbl>,
## # SharpeRatio <dbl>, and abbreviated variable names ¹​FROTO.IS, ²​GARAN.IS
p <- max_sr %>%
gather(AKBNK.IS:YKBNK.IS, key = Asset,
value = Weights) %>%
mutate(Asset = as.factor(Asset)) %>%
ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
geom_bar(stat = 'identity') +
theme_minimal() +
labs(x = 'Assets', y = 'Weights', title = "Tangency Portfolio Weights") +
scale_y_continuous(labels = scales::percent)
ggplotly(p)
p <- portfolio_values %>%
ggplot(aes(x = Risk, y = Return, color = SharpeRatio)) +
geom_point() +
theme_classic() +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(labels = scales::percent) +
labs(x = 'Annualized Risk',
y = 'Annualized Returns',
title = "Portfolio Optimization & Efficient Frontier") +
geom_point(aes(x = Risk,
y = Return), data = min_var, color = 'red') +
geom_point(aes(x = Risk,
y = Return), data = max_sr, color = 'red') +
annotate('text', x = 0.29, y =1.31 , label = "Tangency Portfolio") +
annotate('text', x =0.27 , y =0.82 , label = "Minimum variance portfolio") +
annotate(geom = 'segment', x =0.29 , xend = 0.29, y =1.1 ,
yend =1.10 , color = 'red', arrow = arrow(type = "open")) +
annotate(geom = 'segment', x =0.50 , xend =0.50 , y =1.1 ,
yend =1.10 , color = 'red', arrow = arrow(type = "open"))
ggplotly(p)